/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.input;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.lang.StringUtils;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IAdresse;
import fr.generali.accueilclient.client.om.IContact;
import fr.generali.accueilclient.client.om.IEmail;
import fr.generali.accueilclient.client.om.IPersonne;
import fr.generali.accueilclient.client.om.ISiteInternet;
import fr.generali.accueilclient.client.om.ITelephone;
import fr.generali.accueilclient.client.om.NaturePersonne;
import fr.generali.accueilclient.utils.constantes.MotifModificationAdresseEnum;
import fr.generali.refservcommuns.clients.prima.Quantity;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoDossierMajDossierContact;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoListeDossierMajAdresse;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoListeDossierMajCourriel;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoListeDossierMajPageWeb;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoListeDossierMajTelephone;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoMajBienImmobilier;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoMajInformationMarketingImmobilier;
import fr.generali.refservcommuns.rce.communcontact.dossiercontact.DtoMajModeExploitationFondCommerce;
import fr.generali.refservcommuns.rce.gestioncontact.dtogestioncontact.DtoDossierP14;
import fr.generali.refservcommuns.rce.gestioncontact.dtogestioncontact.DtoListeDossierP14;
import fr.generali.refservcommuns.rce.gestioncontact.gestioncontactservice.GestionContact;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoAdressePostale;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoCourriel;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoDetailAdressePostale;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoInformationCommunication;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoInformationDemarchage;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoPageWeb;
import fr.generali.refservcommuns.rce.servperscom.ctc.gestioncontacts.DtoTelephone;

/**
 * @author selrhazala
 */
@Component("contactToGestionContactConverter")
public class ContactToGestionContactConverter implements Converter<IContact, GestionContact> {

    /**
     * Code mail personnel
     */
    private static final String PERSONNEL = "PER";

    /**
     * Code mail professionnel
     */
    private static final String PROFESSIONNEL = "PRO";

    /**
     * Prefix NPAI
     */
    private static final String PREFIX_MOTIF_NPAI = "n.p.a.i";

    /**
     * {@inheritDoc}
     */
    public GestionContact convert(IContact input) {
        GestionContact gestionContact = null;
        if (input != null) {
            IPersonne client = input.getClient();
            DtoDossierP14 dossierP14 = new DtoDossierP14();

            // init date du jour
            XMLGregorianCalendar today = null;
            try {
                GregorianCalendar gCalendar1 = new GregorianCalendar();
                gCalendar1.setTime(new Date());
                today = DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar1);
            } catch (DatatypeConfigurationException e) {
                e.getMessage();
            }

            // Si input.getAdresse() != null c'est que l'on souhaite modifier
            // l'adresse
            if (input.getAdresse() != null) {
                IAdresse ladresse = input.getAdresse();

                DtoAdressePostale dtoAdressePostale = new DtoAdressePostale();
                dtoAdressePostale.setNomRue(ladresse.getVoie());
                dtoAdressePostale.setCodePostal(ladresse.getCodePostal());
                dtoAdressePostale.setLocalite(ladresse.getVille());
                dtoAdressePostale.setLigne3(ladresse.getPointGeographique());
                dtoAdressePostale.setComplementIdentiteDestinataire(ladresse.getPointRemise());
                dtoAdressePostale.setLigne5(ladresse.getBoitePostale());
                dtoAdressePostale.setPays(ladresse.getCodePays());
                dtoAdressePostale.setValide(ladresse.isIndicateurNormalisation());
                dtoAdressePostale.setIdentifiant(ladresse.getIdentifiant());
                dtoAdressePostale.setIdentiteDestinataire(client.getNumeroClient());
                dtoAdressePostale.setNumOrdre(ladresse.getNumOrdre());
                dtoAdressePostale.setCodeIris(ladresse.getCodeIris());
                dtoAdressePostale.setNatureOccupant(ladresse.getQualiteOccupation());
                dtoAdressePostale.setTypeBatiment(ladresse.getTypeLogement());

                if (StringUtils.isEmpty(ladresse.getMotifModifAdresse())) {
                    dtoAdressePostale
                                    .setRaisonModificationAdresse(MotifModificationAdresseEnum.MOTIF_INITIALISATION_ADRESSE
                                                    .getCode());
                } else {
                    dtoAdressePostale.setRaisonModificationAdresse(ladresse.getMotifModifAdresse());
                }

                dtoAdressePostale.setDateDerniereMaj(today);
                dtoAdressePostale.setDateNormalisationAdresse(today);

                DtoDetailAdressePostale detail = new DtoDetailAdressePostale();
                detail.setMotifNpai(ladresse.getMotifNpai() == null ? StringUtils.EMPTY : ladresse.getMotifNpai());
                detail.setDateNpai(today);
                dtoAdressePostale.setInfoNPAI(detail);

                if (client.isPersonnePhysique()) {
                    dtoAdressePostale.setCodeTypeModeContact(PERSONNEL);
                } else {
                    dtoAdressePostale.setCodeTypeModeContact(PROFESSIONNEL);
                }

                List<DtoAdressePostale> listeAdressePostale = new ArrayList<DtoAdressePostale>();
                listeAdressePostale.add(dtoAdressePostale);

                List<DtoListeDossierMajAdresse> listeDossierMajAdr = new ArrayList<DtoListeDossierMajAdresse>();

                DtoListeDossierMajAdresse dtoListeDossierMajAdresse = new DtoListeDossierMajAdresse();
                dtoListeDossierMajAdresse.setIsCourrier(ladresse.isCourrier());
                dtoListeDossierMajAdresse.setIsFiscal(ladresse.isFiscal());
                dtoListeDossierMajAdresse.setIsPrincipal(ladresse.isPrincipal());
                dtoListeDossierMajAdresse.setDtoAdressePostale(dtoAdressePostale);

                DtoMajInformationMarketingImmobilier infoImmo = new DtoMajInformationMarketingImmobilier();
                DtoMajBienImmobilier bienImmo = new DtoMajBienImmobilier();

                if (StringUtils.isNotEmpty(ladresse.getNbPieces())) {
                    bienImmo.setNombrePiecesPrincipales(BigInteger.valueOf(Long.parseLong(ladresse.getNbPieces())));
                }

                if (StringUtils.isNotEmpty(ladresse.getSurface())) {
                    Quantity quantity = new Quantity();
                    quantity.setValue(BigDecimal.valueOf(Long.parseLong(ladresse.getSurface())));
                    bienImmo.setSurfaceHabitable(quantity);
                }

                infoImmo.setBiensImmobiliersPossedes(bienImmo);

                if (StringUtils.isNotEmpty(ladresse.getFondCommerce())) {
                    DtoMajModeExploitationFondCommerce modeExploit = new DtoMajModeExploitationFondCommerce();
                    modeExploit.setCode(ladresse.getFondCommerce());
                    infoImmo.setModeExploitationFondCommerce(modeExploit);
                }

                dtoListeDossierMajAdresse.setDtoMajInformationMarketingImmobilier(infoImmo);

                if (StringUtils.equalsIgnoreCase(ladresse.getMotifModifAdresse(),
                                MotifModificationAdresseEnum.MOTIF_DEMENAGEMENT_MODIF_ADRESSE.getCode())) {
                    dtoListeDossierMajAdresse.setSupprimerAncienneAdressePrincipale(Boolean.TRUE);
                } else {
                    dtoListeDossierMajAdresse.setSupprimerAncienneAdressePrincipale(Boolean.FALSE);
                }

                listeDossierMajAdr.add(dtoListeDossierMajAdresse);

                if (dossierP14.getDossierContact() == null) {
                    dossierP14.setDossierContact(new DtoDossierMajDossierContact());
                }

                dossierP14.getDossierContact().getAdresse().addAll(listeDossierMajAdr);
            }

            // Si input.getTelephone() != null c'est que l'on souhaite modifier
            // le telephone
            if (input.getTelephone() != null) {
                ITelephone telephone = input.getTelephone();

                DtoTelephone dtoTel = new DtoTelephone();
                dtoTel.setNumero(telephone.getNumero());
                dtoTel.setTypeTelephone(telephone.getType());
                dtoTel.setExtension(telephone.getNumeroPoste());
                dtoTel.setPrecisionTelephone(telephone.getPrecision());
                dtoTel.setNumOrdre(telephone.getNumOrdre());
                dtoTel.setListeRouge(telephone.isListeRouge());

                List<DtoTelephone> listeTelephone = new ArrayList<DtoTelephone>();
                listeTelephone.add(dtoTel);

                if (client.isPersonnePhysique() && !telephone.isProfessionnel()) {
                    dtoTel.setCodeTypeModeContact(PERSONNEL);
                } else {
                    dtoTel.setCodeTypeModeContact(PROFESSIONNEL);
                }

                List<DtoListeDossierMajTelephone> listeDossierMajTel = new ArrayList<DtoListeDossierMajTelephone>();

                DtoListeDossierMajTelephone dtoListeDossierMajTelephone = new DtoListeDossierMajTelephone();
                dtoListeDossierMajTelephone.setIsPrincipal(telephone.isPrincipal());
                dtoListeDossierMajTelephone.setDtoTelephone(dtoTel);

                listeDossierMajTel.add(dtoListeDossierMajTelephone);

                if (dossierP14.getDossierContact() == null) {
                    dossierP14.setDossierContact(new DtoDossierMajDossierContact());
                }

                dossierP14.getDossierContact().getTelephone().addAll(listeDossierMajTel);
            }

            // Si input.getMail() != null c'est que l'on souhaite modifier le
            // mail
            if (input.getMail() != null) {
                IEmail mail = input.getMail();

                DtoCourriel dtoMail = new DtoCourriel();
                if (mail.isMotifNpai()) {
                    if (mail.getAdresse().startsWith(PREFIX_MOTIF_NPAI)) {
                        dtoMail.setAdresseCourriel(mail.getAdresse());
                    } else {
                        dtoMail.setAdresseCourriel(PREFIX_MOTIF_NPAI + mail.getAdresse());
                    }
                } else {
                    if (mail.getAdresse().startsWith(PREFIX_MOTIF_NPAI)) {
                        dtoMail.setAdresseCourriel(mail.getAdresse().substring(PREFIX_MOTIF_NPAI.length(),
                                        mail.getAdresse().length()));
                    } else {
                        dtoMail.setAdresseCourriel(mail.getAdresse());
                    }
                }
                dtoMail.setPrecisionCourriel(mail.getPrecision());
                dtoMail.setNumOrdre(mail.getNumOrdre());

                List<DtoCourriel> listeCourriel = new ArrayList<DtoCourriel>();
                listeCourriel.add(dtoMail);

                if (client.isPersonnePhysique() && !mail.isProfessionnel()) {
                    dtoMail.setCodeTypeModeContact(PERSONNEL);
                } else {
                    dtoMail.setCodeTypeModeContact(PROFESSIONNEL);
                }

                List<DtoListeDossierMajCourriel> listeDossierMajCou = new ArrayList<DtoListeDossierMajCourriel>();

                DtoListeDossierMajCourriel dtoListeDossierMajCourriel = new DtoListeDossierMajCourriel();
                dtoListeDossierMajCourriel.setIsPrincipal(mail.isPrincipal());
                dtoListeDossierMajCourriel.setDtoCourriel(dtoMail);

                listeDossierMajCou.add(dtoListeDossierMajCourriel);

                if (dossierP14.getDossierContact() == null) {
                    dossierP14.setDossierContact(new DtoDossierMajDossierContact());
                }

                dossierP14.getDossierContact().getCourriel().addAll(listeDossierMajCou);
            }

            // Si getSiteInternet() != null c'est que l'on souhaite modifier le
            // site internet
            if (input.getSiteInternet() != null) {
                ISiteInternet siteInternet = input.getSiteInternet();

                DtoPageWeb dtoWeb = new DtoPageWeb();
                dtoWeb.setAdresseSiteWeb(siteInternet.getAdresse());
                dtoWeb.setNumOrdre(siteInternet.getNumOrdre());

                List<DtoPageWeb> listePageWeb = new ArrayList<DtoPageWeb>();
                listePageWeb.add(dtoWeb);

                if (client.isPersonnePhysique() && !siteInternet.isProfessionnel()) {
                    dtoWeb.setCodeTypeModeContact(PERSONNEL);
                } else {
                    dtoWeb.setCodeTypeModeContact(PROFESSIONNEL);
                }

                List<DtoListeDossierMajPageWeb> listeDossierMajWeb = new ArrayList<DtoListeDossierMajPageWeb>();

                DtoListeDossierMajPageWeb dtoListeDossierMajPageWeb = new DtoListeDossierMajPageWeb();
                dtoListeDossierMajPageWeb.setIsPrincipal(siteInternet.isPrincipal());
                dtoListeDossierMajPageWeb.setDtoPageWeb(dtoWeb);

                listeDossierMajWeb.add(dtoListeDossierMajPageWeb);

                if (dossierP14.getDossierContact() == null) {
                    dossierP14.setDossierContact(new DtoDossierMajDossierContact());
                }

                dossierP14.getDossierContact().getPageWeb().addAll(listeDossierMajWeb);
            }

            // Chargement des stopComs
            DtoInformationCommunication dtoInfoCommunication = new DtoInformationCommunication();

            if (client.getCommunication() == null) {
                dtoInfoCommunication.setIndicateurStopCourriel(false);
                dtoInfoCommunication.setIndicateurStopCourrier(false);
                dtoInfoCommunication.setIndicateurStopFax(false);
                dtoInfoCommunication.setIndicateurStopSMS(false);
                dtoInfoCommunication.setIndicateurStopTelephone(false);

                if (NaturePersonne.PARTICULIER.equals(client.getNaturePersonne())
                                || NaturePersonne.PROFESSIONNEL.equals(client.getNaturePersonne())) {
                    dtoInfoCommunication.setCodeTypeModeContact(PERSONNEL);
                } else {
                    dtoInfoCommunication.setCodeTypeModeContact(PROFESSIONNEL);
                }
            } else {
                dtoInfoCommunication.setIndicateurStopCourriel(!client.getCommunication().isEmailOk());
                dtoInfoCommunication.setIndicateurStopCourrier(!client.getCommunication().isCourrierOk());
                dtoInfoCommunication.setIndicateurStopFax(!client.getCommunication().isTelephoneOk());
                dtoInfoCommunication.setIndicateurStopSMS(!client.getCommunication().isSmsOk());
                dtoInfoCommunication.setIndicateurStopTelephone(!client.getCommunication().isTelephoneOk());

                if (NaturePersonne.PARTICULIER.equals(client.getNaturePersonne())
                                || NaturePersonne.PROFESSIONNEL.equals(client.getNaturePersonne())) {
                    dtoInfoCommunication.setCodeTypeModeContact(PERSONNEL);
                } else {
                    dtoInfoCommunication.setCodeTypeModeContact(PROFESSIONNEL);
                }
            }

            if (dossierP14.getDossierContact() == null) {
                dossierP14.setDossierContact(new DtoDossierMajDossierContact());
            }

            dossierP14.getDossierContact().getStopCom().add(dtoInfoCommunication);
            dossierP14.getDossierContact().setCodecanalPrefere(client.getCommunication().getCanalDePreference());

            DtoInformationDemarchage dtoInformationDemarchage = new DtoInformationDemarchage();
            dtoInformationDemarchage.setIndicateurAutorisationInformation(client.getCommunication() == null ? false
                            : client.getCommunication().isAutorisation());
            dtoInformationDemarchage.setIndicateurDemarche(client.getCommunication() == null ? false : client
                            .getCommunication().isAutorisation());
            dossierP14.getDossierContact().setDemarchage(dtoInformationDemarchage);

            dossierP14.setCodeUser("");
            dossierP14.setIdentifiantPersonne(client.getNumeroClient());

            DtoListeDossierP14 dtoListeDossierP14 = new DtoListeDossierP14();
            List<DtoDossierP14> listeDtoDossierP14 = new ArrayList<DtoDossierP14>();
            listeDtoDossierP14.add(dossierP14);
            dtoListeDossierP14.getDossierP14().addAll(listeDtoDossierP14);
            gestionContact = new GestionContact();
            gestionContact.setDtoListeDossierP14(dtoListeDossierP14);
        }

        return gestionContact;
    }
}
